package manager

import (
	"fmt"
	"game-server/interfaces"
	"game-server/message"
	"log"
	"sync"
)

// MessageRouter 消息路由器，管理所有消息ID与处理函数的映射关系
type MessageRouter struct {
	handlers    map[uint32]interfaces.MsgHandler // 消息ID对应的处理函数
	handlerLock sync.RWMutex                     // 读写锁保护handlers
}

// NewMessageRouter 创建一个新的消息路由器
func NewMessageRouter() *MessageRouter {
	return &MessageRouter{
		handlers: make(map[uint32]interfaces.MsgHandler),
	}
}

// AddHandler 添加一个消息处理函数
func (mr *MessageRouter) AddHandler(msgID uint32, handler interfaces.MsgHandler) {
	mr.handlerLock.Lock()
	defer mr.handlerLock.Unlock()

	if _, exists := mr.handlers[msgID]; exists {
		log.Printf("警告: 消息ID %d 的处理函数被覆盖", msgID)
	}

	mr.handlers[msgID] = handler
	log.Printf("注册消息ID %d 的处理函数成功", msgID)
}

// Handle 处理一个消息
func (mr *MessageRouter) Handle(client interfaces.IClient, msgID uint32, data message.IMessage) error {
	mr.handlerLock.RLock()
	handler, exists := mr.handlers[msgID]
	mr.handlerLock.RUnlock()

	if !exists {
		return fmt.Errorf("没有找到消息ID %d 的处理函数", msgID)
	}

	return handler(client, data)
}

// GlobalRouter 全局消息路由器
var GlobalRouter = NewMessageRouter()
